/*
 * @Author: your name
 * @Date: 2021-12-27 13:41:01
 * @LastEditTime: 2021-12-27 13:51:08
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /flutter-learning/Dart_Basic_Grammer/polymorphic.dart
 */

/**
 * Dart 中的多态：
 *    1. 允许将子类类型的指针赋值给父类类型的指针，同一个函数调用会有不同的执行结果
 *    2. 子类的实例赋值给父类的引用
 *    3. 多态就是父类定义一个方法不去实现，让继承他的子类去实现，每个子类有不用的表现
 */

abstract class Animal {
  // 抽象方法
  eat();
  void printInfo() {
    print("In abstracct class Animal");
  }
}

// 子类
class Dog extends Animal {
  @override
  eat() {
    // TODO: implement eat
    // throw UnimplementedError();
    print('little dog');
  }

  run() {
    print("Dog Run");
  }
  
}

class Cat extends Animal {
  @override
  eat() {
    // TODO: implement eat
    // throw UnimplementedError();
    print('Cat eat');
  }
  
}

void main(List<String> args) {
  Dog d = new Dog();
  d.eat();
  d.printInfo();
  Cat c = new Cat();
  d.printInfo();
  c.eat();

  // 抽象类没办法被实例化
  // Animal a = Animal();

  // 多态的另一种实现：允许将子类类型的指针赋值给父类类型的指针
    // 子类的实例赋值给父类的引用
  Animal a = new Dog();
  a.eat();
  // a 无法调用 run() 方法

}